﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.CapaPersistencia;
using Studio7i.CapaDominio;

namespace Studio7i.CapaNegocio
{
    public class AdministracionServiceImpl : IAdministracionService
    {
        #region Dependencias
        //ILocalDAO localDAO = null;
        IInstrumentoDAO instrumentoDAO = null;
        IAdministradorDAO administradorDAO = null;
        IServicioDAO servicioDAO = null;
        IArmadoDeSalaDAO armadoDeSalaDAO = null;
        ISalaDAO salaDAO = null;
        #endregion

        #region Operaciones del Negocio
        #region Registrar Instrumento
        public Instrumento RegistrarInstrumento(String tipoInst, String marcaInst, String modInst, int anhoInst, String carInst, decimal costoInst)
        {
            //validamos que ningún dato venga nulo
            if (tipoInst == null || marcaInst == null || modInst == null || anhoInst == 0 || carInst == null || costoInst == 0)
            {
                throw new DatosInsuficientesException("Faltan datos para crear un instrumento");
            }
            //creamos el instrumento
            Instrumento InstACrear = new Instrumento();
            InstACrear.tipo = tipoInst;
            InstACrear.marca = marcaInst;
            InstACrear.modelo = modInst;
            InstACrear.anhoDeFabricacion = anhoInst;
            InstACrear.caracteristicas = carInst;
            return instrumentoDAO.Crear(InstACrear);
        }
        #endregion
        #region Registrar Servicio
        public Servicio RegistrarServicio(String nomServ, decimal costoServ, string carServ)
        {
            //validamos si la descripción ya fue ingresada
            ICollection<Servicio> ServExiste = servicioDAO.ListarXNombre(carServ);
            if (ServExiste.Count > 0)
            {
                throw new EntidadRepetidaException("La descripción ya fue ingresada, por favor ingrese una nueva descripción ");
            }
            //creamos un nuevo servicio
            Servicio ServACrear = new Servicio();
            ServACrear.nombre = nomServ;
            ServACrear.costoServicio = costoServ;
            ServACrear.descripcion = carServ;
            return servicioDAO.Crear(ServACrear);
        }
        #endregion
        #region Registrar Armado Sala
        public ArmadoDeSala RegistrarArmadoSala(int CoArmado, int SsArmado, int Sala, int Instrumento, int Servicio)
        {

            if (CoArmado == 0)
                throw new DatosInsuficientesException("Ingresar Código Armado de Sala");
            if (SsArmado == 0)
                throw new DatosInsuficientesException("Ingresar Monto de Armado de Sala");
            if (Sala == 0)
                throw new DatosInsuficientesException("Seleccionar Sala");
            if (Instrumento == 0)
                throw new DatosInsuficientesException("Seleccionar Instrumento");
            if (Servicio == 0)
                throw new DatosInsuficientesException("Seleccionar Servicio");

            Sala SalaExistente = salaDAO.Obtener(Sala);
            if (null == SalaExistente)
                throw new DatosNoCoincidanException("NO EXISTE CODIGO DE SALA...");

            Instrumento InstrumentoExistente = instrumentoDAO.Obtener(Instrumento);
            if (null == InstrumentoExistente)
                throw new DatosNoCoincidanException("NO EXISTE INSTRUMENTO...");

            Servicio ServicioExistente = servicioDAO.Obtener(Servicio);
            if (null == ServicioExistente)
                throw new DatosNoCoincidanException("NO EXISTE SERVICIO...");

            ArmadoDeSala ArmadoDeSalaExistente = armadoDeSalaDAO.Obtener(CoArmado);
            if (ArmadoDeSalaExistente.CoArmado > 0)
                throw new EntidadRepetidaException("YA EXISTE CODIGO DE ARMADO DE SALA...");

            ArmadoDeSala ArmadoDeSalacrear = new ArmadoDeSala();
            ArmadoDeSalacrear.CoArmado = 1;
            ArmadoDeSalacrear.SsArmado = SsArmado;
            ArmadoDeSalacrear.Sala = SalaExistente;
            ArmadoDeSalacrear.Instrumento = InstrumentoExistente;
            ArmadoDeSalacrear.Servicio = ServicioExistente;

            ArmadoDeSala ArmadoDeSalacreado = armadoDeSalaDAO.Crear(ArmadoDeSalacrear);
            return ArmadoDeSalacreado;
        }
        #endregion
        #region Modificar Armado Sala
        public ArmadoDeSala ModificarArmadoSala(int CoArmado, int SsArmado, int Sala, int Instrumento, int Servicio)
        {

            if (CoArmado == 0)
                throw new DatosInsuficientesException("Ingresar Código Armado de Sala");
            if (SsArmado == 0)
                throw new DatosInsuficientesException("Ingresar Monto de Armado de Sala");
            if (Sala == 0)
                throw new DatosInsuficientesException("Seleccionar Sala");
            if (Instrumento == 0)
                throw new DatosInsuficientesException("Seleccionar Instrumento");
            if (Servicio == 0)
                throw new DatosInsuficientesException("Seleccionar Servicio");

            Sala SalaExistente = salaDAO.Obtener(Sala);
            if (null == SalaExistente)
                throw new DatosNoCoincidanException("NO EXISTE CODIGO DE SALA...");

            Instrumento InstrumentoExistente = instrumentoDAO.Obtener(Instrumento);
            if (null == InstrumentoExistente)
                throw new DatosNoCoincidanException("NO EXISTE INSTRUMENTO...");

            Servicio ServicioExistente = servicioDAO.Obtener(Servicio);
            if (null == ServicioExistente)
                throw new DatosNoCoincidanException("NO EXISTE SERVICIO...");

            ArmadoDeSala ArmadoDeSalaExistente = armadoDeSalaDAO.Obtener(CoArmado);
            if (null == ArmadoDeSalaExistente)
                throw new DatosInsuficientesException("NO EXISTE CODIGO DE ARMADO DE SALA...");


            ArmadoDeSala ArmadoDeSalamodificar = new ArmadoDeSala();
            ArmadoDeSalamodificar.CoArmado = CoArmado;
            ArmadoDeSalamodificar.SsArmado = SsArmado;
            ArmadoDeSalamodificar.Sala = SalaExistente;
            ArmadoDeSalamodificar.Instrumento = InstrumentoExistente;
            ArmadoDeSalamodificar.Servicio = ServicioExistente;

            ArmadoDeSala ArmadoDeSalamodificado = armadoDeSalaDAO.Modificar(ArmadoDeSalamodificar);
            return ArmadoDeSalamodificado;
        }
        #endregion
        #region Registrar Administrador
        public Administrador InscribirAdmin(string nombre, string mail, string fnacimiento, string clave)
        {
            if (nombre == null || mail == null || clave == null)
                throw new DatosInsuficientesException("Faltan datos para crear a un Administrador");
            ICollection<Administrador> admEncontrados = administradorDAO.ListarXMailYClave(mail, clave);
            if (admEncontrados.Count > 0)
                throw new EntidadRepetidaException("El Administrador ya existe");
            //Creamos un administrador
            Administrador admCrear = new Administrador();
            admCrear.NoAdministrador = nombre;
            admCrear.TxMail = mail;
            admCrear.FeNacimiento = fnacimiento;
            admCrear.TxtClave = clave;
            return administradorDAO.Crear(admCrear);
        }
        #endregion

        #endregion
        #region Metodos de Soporte
        #region metodos de soporte de la entidad sala
        public Sala ObtenerSala(int Codigo)
        {
            return salaDAO.Obtener(Codigo);
        }
        public ICollection<Sala> ListarSalas()
        {
            return salaDAO.ListarTodos();
        }
        #endregion
        #region Metodos de soporte Armado de Sala
        public ICollection<ArmadoDeSala> ListarArmadoSala(int CoArmado, int SsArmado, int CoSala, int CoInstrumento, int CoServicios)
        {
            return armadoDeSalaDAO.ListarTodos();
        }

        #endregion
        #region Metodos de Soporte Servicio
        public Servicio ObtenerServicio(int codigo)
        {
            return servicioDAO.Obtener(codigo);
        }
        public ICollection<Servicio> ListarServicios(string nombre)
        {
            return servicioDAO.ListarXNombre(nombre);
        }
        //public ICollection<Servicio> ListarCaracteristicasServicios(string caracteristicas)
        //{
        //    return servicioDAO.ListarTodos(caracteristicas);
        //}


        #endregion

        #region metodos de soporte de la entidad instrumento
        public Instrumento ObtenerInstrumento(int Codigo)
        {
            return instrumentoDAO.Obtener(Codigo);
        }
        public ICollection<Instrumento> ListarInstrumentos()
        {
            return instrumentoDAO.ListarTodos();
        }
        #endregion
        #region Metodos de soporte para entidad Administrador
        public Administrador ObtenerAdm(int codigo)
        {
            return administradorDAO.Obtener(codigo);
        }
        public Administrador ModificarAdm(Administrador admModificar)
        {
            return administradorDAO.Modificar(admModificar);
        }
        public void EliminarAdm(Administrador admEliminar)
        {
            administradorDAO.Eliminar(admEliminar);
        }
        public ICollection<Administrador> ListarAdministradores()
        {
            return administradorDAO.ListarTodos();
        }
        public ICollection<Administrador> ListarEmailCorreo(String nombre, String clave)
        {
            return administradorDAO.ListarXMailYClave(nombre, clave);
        }
        #endregion
        #endregion

    }
}